home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 4 / Apprentice-Release4.iso / Source Code / C / Applications / µSim 1.0.5 / FabLibsƒ / SoundHandling.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-11-17  |  1.7 KB  |  74 lines  |  [TEXT/CWIE]

  1. #include    "FabWmemman.h"
  2. #include    "FabTaskManager.h"
  3. #include    "SoundHandling.h"
  4.  
  5. static SndCallBackUPP    gmyCallbackUPP = nil;
  6. static unsigned short    gNumAsyncSnds = 0;
  7.  
  8. static pascal void myCallback(SndChannelPtr theChan, const SndCommand *sc);
  9. static void CloseSoundChannel(long sndChan);
  10. static void GetRidOfSndChannel(SndChannelPtr sndChan);
  11.  
  12. unsigned short GetSoundsRemaining(void)
  13. {
  14. return gNumAsyncSnds;
  15. }
  16.  
  17. void InitMySoundHandling(void)
  18. {
  19. gmyCallbackUPP = NewSndCallBackProc(myCallback);
  20. }
  21.  
  22. pascal void myCallback(SndChannelPtr theChan, const SndCommand *sc)
  23. {
  24. PROCCALLEDATINTERRUPTTIME((TMInfoPtr)sc->param2, (long)theChan);
  25. }
  26.  
  27. void DoSound(short sndResID)
  28. {
  29. SndListHandle    sndH;
  30.  
  31. if (sndH = (SndListHandle)Get1Resource('snd ', sndResID))
  32.     DoSoundHandle(sndH);
  33. }
  34.  
  35. void DoSoundHandle(SndListHandle sndH)
  36. {
  37. SndCommand    mySndCmd;
  38. SndChannelPtr    mySndChan;
  39.  
  40. mySndChan = (SndChannelPtr)fmalloc(sizeof(SndChannel));
  41. if (mySndChan) {
  42.     mySndChan->qLength = 4;
  43.     if (SndNewChannel(&mySndChan, 0, 0, gmyCallbackUPP) == noErr) {
  44.         if (gNumAsyncSnds == 0)
  45.             HLockHi((Handle)sndH);
  46.         mySndChan->userInfo = (long)sndH;
  47.         mySndCmd.cmd = callBackCmd;
  48.         mySndCmd.param2 = (long)NewTaskAlloc(sizeof(TMInfo));
  49.         if (mySndCmd.param2) {
  50.             if (SndPlay(mySndChan, sndH, true) == noErr)
  51.                 gNumAsyncSnds++;
  52.             InitTaskRecord(CloseSoundChannel, (TMInfoPtr)mySndCmd.param2);
  53.             (void)SndDoCommand(mySndChan, &mySndCmd, true);
  54.             }
  55.         else
  56.             GetRidOfSndChannel(mySndChan);
  57.         }
  58.     }
  59. }
  60.  
  61. void CloseSoundChannel(long sndChan)
  62. {
  63. if (--gNumAsyncSnds == 0)
  64.     HUnlock((Handle)((SndChannelPtr)sndChan)->userInfo);
  65. GetRidOfSndChannel((SndChannelPtr)sndChan);
  66. }
  67.  
  68. static void GetRidOfSndChannel(SndChannelPtr sndChan)
  69. {
  70. (void)SndDisposeChannel(sndChan, false);
  71. ffree((Ptr)sndChan);
  72. }
  73.  
  74.